/*
 * Evento.java
 * 
 * Projeto: Kruskal - SRAC
 * LEDS - Laboratório de Engenharia e Desenvolvimento de Software
 * IFES - Instituto Federal do Espírito Santo - Campus Serra.
 */

package srac.controleeventos.cdp;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Properties;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import util.utilitarioPersistencia.ObjetoPersistente;

@Entity
public class Certificado extends ObjetoPersistente {
    private String codigo;   
    private byte[] arquivo;
    private Evento evento;
    private Participante participante;

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(nullable = true)
    public Evento getEvento() {
        return evento;
    }

    public void setEvento(Evento evento) {
        this.evento = evento;
    }

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(nullable = true)
    public Participante getParticipante() {
        return participante;
    }

    public void setParticipante(Participante participante) {
        this.participante = participante;
    }

    public byte[] getArquivo() {
        return arquivo;
    }

    public void setArquivo(byte[] arquivo) {
        this.arquivo = arquivo;
    }
    
    /*
     * Aqui estão os métodos para gerar código.
     */
    
    /**
     * Gera código/certificação do certificado a partir do arquivo, codigoEvento, matricula ou cpf do participante
     * @param arquivo
     * @param codigoEvento
     * @param matCPF
     * @return
     * @throws NoSuchAlgorithmException 
     */
    public static String gerarCodigoCertificado(byte [] arquivo, String codigoEvento, String matCPF) throws NoSuchAlgorithmException{
        
        String codigoGerado;
        
        MessageDigest md =  MessageDigest.getInstance("MD5");  
        int size = arquivo.length+ codigoEvento.length() + matCPF.length();

        byte[] arrayCodigoSeeds = new byte[size];

        for (int i = 0; i < arquivo.length; i++) {
            arrayCodigoSeeds[i] = arquivo[i];
        }
        for (int i = 0; i < codigoEvento.length(); i++) {
            arrayCodigoSeeds[i+arquivo.length] = codigoEvento.getBytes()[i];
        }
        for (int i = 0; i < matCPF.length(); i++) {
            arrayCodigoSeeds[i+arquivo.length+codigoEvento.length()] = matCPF.getBytes()[i];
        }

        md.update(arrayCodigoSeeds);
        codigoGerado = byte2StringHexa(md.digest());  
        return codigoGerado;
        
    }

    private static String byte2StringHexa(byte[] bytes) {
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            int parteAlta = ((bytes[i] >> 4) & 0xf) << 4;
            int parteBaixa = bytes[i] & 0xf;
            if (parteAlta == 0) {
                s.append('0');
            }
            s.append(Integer.toHexString(parteAlta | parteBaixa));
        }
        return s.toString();
    }
    
//    public Properties retrieveProperties() throws IOException{
//        Properties prop = new Properties();
//        prop.load(this.getClass().getClassLoader().getResourceAsStream("/certificado.properties"));
//        
//        return prop;
//    }
    
}
